import requests
from bs4 import BeautifulSoup
# bs4是BeautifulSoup库的包名（Beautiful Soup 4版本）
# #BeautifulSoup是一个用于解析HTML和XML文档的Python库，用于提取和操作网页数据(用于网络爬虫数据抓取)
import os  # 提供了与操作系统交互的功能(文件目录创建删除遍历等，路径访问，进程管理)
import urllib.parse
from urllib.parse import urljoin  # urljoin用于将两个URL进行智能拼接,它会根据相对路径和绝对路径的规则，正确地组合基础URL和目标URL

# 1.如果保存图片的文件夹不存在，则创建
save_folder = "download_images"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

explore_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

try:
    html_url = "https://www.zhangxinxu.com/wordpress/2024/07/html%e5%b9%b6%e4%b8%8d%e7%ae%80%e5%8d%95/"
    response = requests.get(html_url, headers=explore_headers)
    response.raise_for_status()
    response.encoding = response.apparent_encoding
    # response.apparent_encoding 是 requests 库中 Response 对象的一个属性，它基于响应内容的字节流，
    # 通过分析内容的实际字符分布来推断最可能使用的字符编码（如 utf-8、gbk 等）(因为需要经过计算，所以性能较差，但准确度更高)。

    # 解析html
    soup = BeautifulSoup(response.text, 'html.parser')

    # 查找所有img标签
    img_tags = soup.find_all('img')

    print(f"找到 {len(img_tags)} 个图片标签")

    # 下载每张图片
    for i, img in enumerate(img_tags):
        print(f"正在处理第 {i+1} 张图片: {img.get('src') or img.get('data-src')}")
        img_url = img.get('src') or img.get('data-src')

        if not img_url:
            continue
        # 处理相对路径
        img_url = urljoin(html_url, img_url)
        # urljoin 函数会识别 img_url 是一个协议相对URL（以 // 开头）它会使用基础URL的协议（https）来补全目标URL

        # 获取图片文件名
        parsed_url = urllib.parse.urlparse(img_url)  # 使用urllib.parse.urlparse()解析图片URL，将其分解为协议、域名、路径等组件
        img_name = os.path.basename(parsed_url.path)  # 通过os.path.basename()提取URL路径中的文件名部分，作为图片名称

        # 如果没有文件名(文件名不存在或者文件名中不包含.)， 使用默认名称(image_{i+1}.jpg作为文件名)
        if not img_name or '.' not in img_name:
            img_name = f"image_{i+1}.jpg"

        # 构造完整的保存路径 # 这是Python中处理文件路径的标准做法，可以确保跨平台兼容性
        save_path = os.path.join(save_folder, img_name)

        # 下载图片
        try:
            img_response = requests.get(img_url, headers=explore_headers)
            img_response.raise_for_status()

            # 用with语句以二进制写入模式('wb')打开指定路径的文件,with语句确保文件在使用完毕后自动关闭,
            # 即使发生异常也会正确释放文件资源。 文件对象被赋值给变量file，供后续写入操作使用。
            with open(save_path, 'wb') as file:
                # 这段代码的功能是将HTTP响应的内容写入文件。(这通常用于下载并保存网络图片到本地文件)
                # img_response.content 获取HTTP响应的二进制内容（通常是图片数据）
                file.write(img_response.content)
            print(f"已经下载: {img_name} 图片成功")
        except Exception as e:
            print(f"下载图片失败 {img_url}: {e}")

except Exception as e:
    print(f"获取图片内容失败： {e}")
